'use strict';
var vk; // 全局vk实例
// 涉及的表名
const dbName = require("../../../dao/config.js");

var db = uniCloud.database(); // 全局数据库引用
var _ = db.command; // 数据库操作符
var $ = _.aggregate; // 聚合查询操作符
/**
 * 权限注意：访问以下链接查看
 * 文档地址：https://vkdoc.fsq.pub/client/uniCloud/cloudfunctions/cloudObject.html#内置权限
 */
var cloudObject = {
	isCloudObject: true, // 标记为云对象模式
	/**
	 * 请求前处理，主要用于调用方法之前进行预处理，一般用于拦截器、统一的身份验证、参数校验、定义全局对象等。
	 * 文档地址：https://vkdoc.fsq.pub/client/uniCloud/cloudfunctions/cloudObject.html#before-预处理
	 */
	_before: async function() {
		vk = this.vk; // 将vk定义为全局对象
		// let { customUtil, uniID, config, pubFun } = this.getUtil(); // 获取工具包
	},
	/**
	 * 请求后处理，主要用于处理本次调用方法的返回结果或者抛出的错误
	 * 文档地址：https://vkdoc.fsq.pub/client/uniCloud/cloudfunctions/cloudObject.html#after-后处理
	 */
	_after: async function(options) {
		let { err, res } = options;
		if (err) {
			return; // 如果方法抛出错误，直接return;不处理
		}
		return res;
	},
	/**
	 * 获取列表
	 * @url admin/business/sys.goodsCategory.kh_getList 前端调用的url参数地址
	 */
	kh_getList: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			tree = true
		} = data;
		data.pageIndex = 1;
		data.pageSize = 500; // 强制500
		// 最大支持500个分类
		let list = await vk.daoCenter.categoryDao.getTableData({
			data,
			getMain: true,
			getCount: true,
			sortArr: [{ name: "sort", type: "asc" }]
		});
		let rows;
		if (tree) {
			// 数组转树形
			rows = vk.pubfn.arrayToTree(list, {
				id: "_id",
				parent_id: "parent_id",
				children: "children"
			});
		} else {
			rows = list;
		}
		res = {
			code: 0,
			rows
		};
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 添加和修改
	 * @url admin/business/sys.goodsCategory.addUpdate 前端调用的url参数地址
	 */
	addUpdate: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id,
			parent_id,
			icon,
			name,
			description,
			sort = 0,
			enable,
			is_index_show,
		} = data;

		let dataJson = {
			parent_id,
			icon,
			name,
			description,
			sort: Number(sort),
			enable,
			is_index_show,
		};
		if (vk.pubfn.isNull(_id)) {
			// 添加
			_id = await vk.daoCenter.categoryDao.add(dataJson);
			res.msg = "添加成功";
		} else {
			// 修改并返回修改后的数据
			res.info = await vk.daoCenter.categoryDao.updateAndReturn({
				whereJson: {
					_id
				},
				dataJson
			});
			res.num = res.info ? 1 : 0;
			res.msg = "修改成功";
		}
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 删除
	 * @url admin/business/sys.goodsCategory.delete 前端调用的url参数地址
	 */
	delete: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id
		} = data;
		// 如果有子分类，则不可以删除当前分类
		let num1 = await vk.daoCenter.categoryDao.count({
			parent_id: _id
		});
		if (num1 > 0) return { code: -1, msg: "该分类下有子分类，无法删除！" };
		// 如果该分类有商品，也不可以删除当前分类
		let num2 = await vk.daoCenter.goodsDao.count({
			category_ids: _id,
			status: _.neq(3)
		});
		if (num2 > 0) return { code: -1, msg: "该分类下有商品，无法删除！" };
		await vk.daoCenter.categoryDao.deleteById(_id);
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 当前分类最大的sort
	 * @url admin/business/sys.goodsCategory.getMaxSort 前端调用的url参数地址
	 */
	getMaxSort: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			parent_id
		} = data;
		let sort = await vk.daoCenter.categoryDao.max({
			fieldName: "sort",
			whereJson: {
				parent_id,
				sort:_.gte(0)
			}
		});
		res.sort = sort || 0;
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 模板函数
	 * @url admin/business/sys.goodsCategory.test 前端调用的url参数地址
	 */
	test: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------


		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
};

module.exports = cloudObject;
